package p1TopN;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

public class topnReducer extends Reducer<Text,AverageTempBean,Text,AverageTempBean> {
    private TreeMap<AverageTempBean,Text> treeMap=new TreeMap<>();

    @Override
    protected void reduce(Text key, Iterable<AverageTempBean> values, Context context) throws IOException, InterruptedException {
        for(AverageTempBean value:values){
            //treeMap里面插入的必须是实例化的对象，现在的value只是一个引用变量（每一次遍历指向集合中的一个新的对象）并不是一个实例化的对象。
            AverageTempBean atBean=new AverageTempBean();
            atBean.set(value.getAt(),value.getAtu(),value.getCity(),value.getCountry(),value.getLatitude(),value.getLongitude());

            //此时的key也不是实例化对象，所以要先实例化一个对象。
            Text date=new Text(key);
            treeMap.put(atBean,date);

            if(treeMap.size()>10){
                treeMap.remove(treeMap.lastKey());
            }
        }

    }

    @Override
    protected void cleanup(Context context) throws IOException, InterruptedException {
        Set<AverageTempBean> atBeans=treeMap.keySet();
        Iterator<AverageTempBean> iterator = atBeans.iterator();
        while (iterator.hasNext()){
            AverageTempBean atBean=iterator.next();
            Text text=treeMap.get(atBean);

            context.write(text,atBean);
        }
    }
}
